package com.hzzy.service.impl;

import java.text.Collator;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.hzzy.IDao.HzSystemMapper;
import com.hzzy.bean.HzSystem;
import com.hzzy.bean.HzSystemExample;
import com.hzzy.service.HzSystemService;
import com.hzzy.utils.AnalysisBasicParams;
import com.hzzy.utils.DateUtil;

@Service
public class HzSystemServiceImpl implements HzSystemService{
	
	private static List<HzSystem> HZ_SYSTEM_LIST = null;	//放入缓存中，减少对数据库的访问，但是吃内存
	private final int PUSH_TIME_HOUR = 24;	//默认刷新时间 24小时
	private static Map<String, String> CLASS_TIMES_MAP;	// 存放课次时间段
	private static List<Integer> CLASS_TIMES_NAMES;	//CLASS_TIMES_MAP 经过排序后的对应的属性名
	
	private static String CURRNT_DAY_COURSE_FINISH = "";	// 当课程结束的之后的术语
	private static String CURRNT_DAY_COURSE_DNS = ""; // 早上课程还未开始的时候的术语
	
	private static String BAN_EDIT_CHECKINS_TIME = "";
	/**
	 * 上次更新时间
	 */
	private static long LAST_TIME = System.currentTimeMillis();
	@Autowired
	private HzSystemMapper hzSystemMapper;		//系统配置信息
	
	/**
	 * 根据当前时间段判断当前的课次
	 * @return
	 */
	public int getCurrentClassTimes() {
		initData();
		// 取出满足 systemName的 值
		String currentDateStr =DateUtil.dateFormat("HH:mm",  new Date());
		for (Integer key : CLASS_TIMES_NAMES) {
			// map.value = 08:15_09:00  ---> currentDateStr > 09:00 大于下课时间
			if (DateUtil.dateContrast(currentDateStr, CLASS_TIMES_MAP.get(key + "").split("_")[1], "HH:mm") == 1) {
				continue;
			} else {
				// map.value = 08:15_09:00  ---> currentDateStr >= 08:15 大于上课时间
				return key;
			} 
		}
		return 0;
	}
	

	public boolean getSubmitCheckins(Date date) {
		initData();
		// 获取第一节课开始上课的时间
		String startTime =  CLASS_TIMES_MAP.get(CLASS_TIMES_NAMES.get(0) + "").split("_")[1];
		String currentDateStr =DateUtil.dateFormat("HH:mm",  date);
		int resultVal = DateUtil.dateContrast(currentDateStr, startTime, "HH:mm");
		if (resultVal == -1)
			return false;
		return true;
	}

	
	public String judgeCurrentTime(Date date) {
		initData();
		
		for (HzSystem hz : HZ_SYSTEM_LIST) {
			if ("day_course_finish_time".equals(hz.getSystemName())) {
				// 判断 该时间段是否 在今天一天的课程结束时间之后
				if (DateUtil.dateContrast(DateUtil.dateFormat("HH:mm",  date), hz.getSystemValue(), "HH:mm") == 1) {
					return CURRNT_DAY_COURSE_FINISH; 
				}
			} else if ("day_course_start_time".equals(hz.getSystemName())) {
				// 判断 该时间段是否 在今天一天的课程开始时间之前
				if (DateUtil.dateContrast(DateUtil.dateFormat("HH:mm",  date), hz.getSystemValue(), "HH:mm") == -1) {
					return CURRNT_DAY_COURSE_DNS; 
				}
			}
		}
		
		return null;
	}
	

	public boolean isEditCheckins(Date date) {
		initData();

		int state = DateUtil.dateContrast(DateUtil.dateFormat("HH:mm",  date), BAN_EDIT_CHECKINS_TIME, "HH:mm");
		if (state == 1)
			return false;
		return true;
	}
	

	public String getIsEditCheckinsTime() {
		return BAN_EDIT_CHECKINS_TIME;
	}
	
	/**
	 * 初始化HZ_SYSTEM_LIST数据
	 */
	private synchronized void initData() {
		if (HZ_SYSTEM_LIST == null || updateLastTimeInterval() || HZ_SYSTEM_LIST.size() == 0) {
			synchronized(this) {
				if (HZ_SYSTEM_LIST == null || updateLastTimeInterval()) {
					HzSystemExample example = new HzSystemExample();
					example.createCriteria().andDeleteFlagEqualTo(0);
					HZ_SYSTEM_LIST = hzSystemMapper.selectByExample(example);
					// 对课次数据进行处理 
					if (HZ_SYSTEM_LIST != null) {
						CLASS_TIMES_NAMES = new ArrayList<Integer>();
						CLASS_TIMES_MAP = new HashMap<String, String>();
						for (HzSystem hs : HZ_SYSTEM_LIST) {
							if (Pattern.compile("([\\d]{2}:[\\d]{2})_([\\d]{2}:[\\d]{2})").matcher(hs.getSystemValue()).find()) {
								CLASS_TIMES_MAP.put(hs.getSystemName(), hs.getSystemValue());
								CLASS_TIMES_NAMES.add(Integer.parseInt(hs.getSystemName()));
							} else if ("currnt_day_course_finish".equals(hs.getSystemName())) {
								CURRNT_DAY_COURSE_FINISH = hs.getSystemValue();
							} else if ("currnt_day_course_dns".equals(hs.getSystemName())) {
								CURRNT_DAY_COURSE_DNS = hs.getSystemValue();
							} else if ("ban_edit_checkins_time".equals(hs.getSystemName())) {
								BAN_EDIT_CHECKINS_TIME = hs.getSystemValue();
							}
						}
						// 进行排序
						if (CLASS_TIMES_NAMES.size() > 0) {
							Collections.sort(CLASS_TIMES_NAMES);
						}
					}
				}
			}
		}
	}
	
	/**
	 * 判断是否需要更新数据
	 * @return
	 */
	private boolean updateLastTimeInterval() {
		String str = AnalysisBasicParams.getValueByKey("update.cache.interval.time");
		//默认
		int intervalHour = PUSH_TIME_HOUR;
		if (StringUtils.isNotEmpty(str)) {
			intervalHour = Integer.parseInt(str);
		}
		//如果 上次的刷新时间距离当前的时间大于 1000 * 60 * 60 * intervalHour 那么就刷新数据
		if (LAST_TIME - System.currentTimeMillis() > 1000 * 60 * 60 * intervalHour) {
			LAST_TIME = System.currentTimeMillis();
			return true;
		}
		return false;
	}
}
